package aggregate

import (
	"context"
)

// EventService 事件服务接口
// 注意：Event实体中的字段未必都会存在，根据事件类型不同，可能只有部分字段有值。
type EventService interface {
	// subscribe 订阅事件流
	subscribe() (result <-chan Event)

	// publish 发布事件
	publish(ctx context.Context, event Event) error
}

// EventKind 事件类型别名
type EventKind string

type Event struct {
	WorkflowID             string
	WorkflowName           string
	WorkflowBusinessParams string
	NodeID                 string
	// SponsorID 发起人
	SponsorID string

	ReviewTaskID string
	Kind         EventKind
	FormContent  string
	// ReviewerIDs 审批人ID列表
	ReviewerIDs []string
}

// IsErrorEvent 判断是否为错误事件
// 错误事件包括：工作流启动失败、工作流创建失败、节点处理失败、条件不匹配
//
// 返回值:
//   - bool: 如果是错误事件返回true，否则返回false
func (e *Event) IsErrorEvent() bool {
	return e.Kind == EventKindWorkflowStartFailed || e.Kind == EventKindConditionNotMet
}

// NewNodePassedEvent 创建节点通过事件
func NewNodePassedEvent(workflowID, nodeID, reviewTaskID string) Event {
	return Event{
		WorkflowID:   workflowID,
		NodeID:       nodeID,
		ReviewTaskID: reviewTaskID,
		Kind:         EventKindNodePassed,
	}
}

// NewNodeRejectedEvent 创建节点拒绝事件
func NewNodeRejectedEvent(workflowID, nodeID, reviewTaskID string) Event {
	return Event{
		WorkflowID:   workflowID,
		NodeID:       nodeID,
		ReviewTaskID: reviewTaskID,
		Kind:         EventKindNodeRejected,
	}
}

// NewReviewTasksCreatedEvent 创建审批任务创建事件
func NewReviewTasksCreatedEvent(workflowID, nextNodeID, reviewTaskID string) Event {
	return Event{
		WorkflowID:   workflowID,
		NodeID:       nextNodeID,
		ReviewTaskID: reviewTaskID,
		Kind:         EventKindReviewTasksCreated,
	}
}

// NewWorkflowPassedEvent 创建工作流通过事件
func NewWorkflowPassedEvent(workflowID, nodeID, reviewTaskID string) Event {
	return Event{
		WorkflowID:   workflowID,
		NodeID:       nodeID,
		ReviewTaskID: reviewTaskID,
		Kind:         EventKindWorkflowPassed,
	}
}

// NewWorkflowRejectedEvent 创建工作流拒绝事件
func NewWorkflowRejectedEvent(workflowID, nodeID, reviewTaskID string) Event {
	return Event{
		WorkflowID:   workflowID,
		NodeID:       nodeID,
		ReviewTaskID: reviewTaskID,
		Kind:         EventKindWorkflowRejected,
	}
}

// NewWorkflowCanceledEvent 创建工作流撤销事件
// 参数说明:
//   - workflowID: 被撤销的工作流ID
//
// 返回值:
//   - Event: 工作流撤销事件对象
func NewWorkflowCanceledEvent(workflowID string) Event {
	return Event{
		WorkflowID: workflowID,
		Kind:       EventKindWorkflowCanceled,
	}
}

// NewWorkflowDeletedEvent 创建工作流删除事件
// 参数说明:
//   - workflowID: 被删除的工作流ID
//
// 返回值:
//   - Event: 工作流删除事件对象
func NewWorkflowDeletedEvent(workflowID string) Event {
	return Event{
		WorkflowID: workflowID,
		Kind:       EventKindWorkflowDeleted,
	}
}

// NewWorkflowStartFailedEvent 创建工作流启动失败事件
// 参数说明:
//   - formContent: 表单内容
//
// 返回值:
//   - Event: 工作流启动失败事件对象
func NewWorkflowStartFailedEvent(formContent string) Event {
	return Event{
		FormContent: formContent,
		Kind:        EventKindWorkflowStartFailed,
	}
}

// NewWorkflowStartSuccessEvent 创建工作流启动成功事件
// 参数说明:
//   - workflowID: 启动成功的工作流ID
//   - nodeID: 当前节点ID
//
// 返回值:
//   - Event: 工作流启动成功事件对象
func NewWorkflowStartSuccessEvent(workflowID, formContent string) Event {
	return Event{
		WorkflowID:  workflowID,
		FormContent: formContent,
		Kind:        EventKindWorkflowStartSuccess,
	}
}

// NewTimeoutAlertEvent 创建工作流超时提醒事件
// 参数说明:
//   - workflowID: 超时的工作流ID
//   - nodeID: 超时的节点ID
//   - reviewerIDs: 待审批人员ID列表
//
// 返回值:
//   - Event: 工作流超时提醒事件对象
func NewTimeoutAlertEvent(workflowID, nodeID string, reviewerIDs []string) Event {
	return Event{
		WorkflowID:  workflowID,
		NodeID:      nodeID,
		ReviewerIDs: reviewerIDs,
		Kind:        EventKindTimeoutAlert,
	}
}

// NewConditionNotMetEvent 创建条件不匹配事件
// 参数说明:
//   - workflowID: 工作流ID
//   - nodeID: 条件节点ID
//
// 返回值:
//   - Event: 条件不匹配事件对象
func NewConditionNotMetEvent(WorkflowName, sponsorID, workflowBusinessParams string) Event {
	return Event{
		WorkflowName:           WorkflowName,
		SponsorID:              sponsorID,
		WorkflowBusinessParams: workflowBusinessParams,
		Kind:                   EventKindConditionNotMet,
	}
}

// 事件类型常量定义，对应原来Hook接口中的方法
// 事件触发顺序：EventKindNodePassed/EventKindNodeRejected -> EventKindReviewTasksCreated -> EventKindWorkflowPassed/EventKindWorkflowRejected
const (
	// EventKindNodePassed 节点审批通过事件
	// 触发时机：当整个节点被审批通过后立即触发（第1步）
	// 包含信息：workflowID, nodeID, reviewTaskID（被通过的审批任务ID）, reviewerID（审批人ID）
	EventKindNodePassed EventKind = "node_passed"

	// EventKindNodeRejected 节点审批拒绝事件
	// 触发时机：当整个节点审批被拒绝后立即触发（第1步）
	// 包含信息：workflowID, nodeID, reviewTaskID（被拒绝的审批任务ID）, reviewerID（审批人ID）
	EventKindNodeRejected EventKind = "node_rejected"

	// EventKindReviewTasksCreated 审批任务创建事件
	// 触发时机：当节点审批结束并流转到下个节点，下个节点的审批任务创建完成后触发（第2步）
	// 包含信息：businessID, formContent, businessCode, nextNodeID, nextNodeReviewTasks
	// 注意：只有在节点通过且存在下个节点时才会触发
	EventKindReviewTasksCreated EventKind = "review_tasks_created"

	// EventKindWorkflowPassed 工作流审批通过事件
	// 触发时机：当整个工作流审批完成并通过后触发（第3步，最后一步）
	// 包含信息：businessID, formContent, businessCode, nodeReviewTasks（所有节点的审批任务）
	EventKindWorkflowPassed EventKind = "workflow_passed"

	// EventKindWorkflowRejected 工作流驳回事件
	// 触发时机：当工作流被驳回时触发（可能在任意节点被拒绝时发生）
	// 包含信息：workflowID, businessID, formContent, businessCode
	EventKindWorkflowRejected EventKind = "workflow_rejected"

	// EventKindWorkflowCanceled 工作流撤销事件
	// 触发时机：当工作流被撤销时触发（通过CancelWorkflow方法）
	// 包含信息：workflowID（被撤销的工作流ID）
	EventKindWorkflowCanceled EventKind = "workflow_canceled"

	// EventKindWorkflowDeleted 工作流删除事件
	// 触发时机：当工作流被删除时触发（通过RemoveWorkflow方法）
	// 包含信息：workflowID（被删除的工作流ID）
	EventKindWorkflowDeleted EventKind = "workflow_deleted"

	// EventKindWorkflowStartSuccess 工作流启动成功事件
	// 触发时机：当工作流启动成功时触发（通过StartWorkflow方法）
	// 包含信息：workflowID（启动成功的工作流ID）, nodeID（当前节点ID）
	EventKindWorkflowStartSuccess EventKind = "workflow_start_success"

	// EventKindWorkflowStartFailed 工作流启动失败事件
	// 触发时机：当工作流启动过程中发生错误时触发（通过StartWorkflow方法）
	// 包含信息：workflowID（启动失败的工作流ID，可能为空）
	EventKindWorkflowStartFailed EventKind = "workflow_start_failed"

	// EventKindTimeoutAlert 工作流超时提醒事件
	// 触发时机：当节点创建时间超过工作流模板配置的超时时间时触发
	// 包含信息：workflowID（超时的工作流ID）、nodeID（超时的节点ID）、reviewerIDs（待审批人员ID列表）
	EventKindTimeoutAlert EventKind = "timeout_alert"

	// EventKindConditionNotMet 工作流条件节中的逻辑无法被命中
	// 触发时机：当条件节点中的逻辑表达式全部都米
	// 包含信息：workflowID（超时的工作流ID）、nodeID（超时的节点ID）、reviewerIDs（待审批人员ID列表）
	EventKindConditionNotMet EventKind = "condition_not_met"
)
